Modul 15 von 16 · 📖 8 min Lesezeit · ⏱ 30 min gesamt
FI-AE 15 DevOps — CI-CD-Pipelines und Container
Inhaltsverzeichnis (7 Abschnitte)
FI-AE 15 DevOps — CI/CD-Pipelines und Container
In diesem Modul erlernen Sie die Grundlagen der modernen Softwarebereitstellung durch CI/CD-Pipelines und Containerisierung. Sie verstehen, wie automatisierte Build-, Test- und Deploy-Prozesse die Entwicklung beschleunigen und stabilisieren. Zudem erwerben Sie praktische Kenntnisse in Docker und Kubernetes, um Anwendungen skalierbar und portabel zu betreiben.
Konzepte und Hintergrund
- CI/CD-Pipeline
- Ein automatisierter Prozess, der Codeänderungen durch Build-, Test- und Deploy-Schritte führt, um kontinuierliche Integration und Bereitstellung zu gewährleisten.
- Docker
- Eine Plattform zur Containerisierung von Anwendungen, die Abhängigkeiten bündelt und eine konsistente Umgebung über verschiedene Systeme hinweg sicherstellt.
- Kubernetes
- Ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen.
- Pod
- Die kleinste deploybare Einheit in Kubernetes, die eine oder mehrere Container mit gemeinsamem Netzwerk und Speicher umfasst.
- Deployment
- Ein Kubernetes-Objekt, das deklariert, wie eine Anwendung ausgeführt werden soll, und für die Verwaltung von ReplicaSets verantwortlich ist.
Architektur-Diagramm
flowchart LR A[Entwickler] --> B[Git-Repository] B --> C[CI/CD-Server] C --> D[Docker-Registry] D --> E[Kubernetes-Cluster] E --> F[Produktivumgebung] C --> G[Testumgebung]
Praktische Schritte
- Installieren Sie Docker auf Ihrem System mit dem Befehl
, um Container zu erstellen und zu verwalten.sudo apt install docker.io - Erstellen Sie ein Dockerfile mit einer Basis-Image-Anweisung wie
, um Ihre Anwendungsumgebung zu definieren.FROM ubuntu:20.04 - Bauen Sie Ihr Docker-Image mit
, um Ihre Anwendung in ein Container-Image zu kompilieren.docker build -t meine-app:latest . - Pushen Sie das Image in eine Registry mit
, damit es im Cluster verfügbar ist.docker push meine-app:latest - Erstellen Sie ein Kubernetes-Deployment-Manifest mit
, um Ihre Anwendung im Cluster bereitzustellen.kubectl apply -f deployment.yaml - Erstellen Sie einen Service mit
, um den Zugriff auf Ihre Anwendung zu ermöglichen.kubectl expose deployment meine-app --port 80 - Implementieren Sie eine CI/CD-Pipeline mit Jenkins oder GitLab CI, um Builds und Deploys zu automatisieren.
- Konfigurieren Sie einen Health-Check in Ihrem Deployment, um die Verfügbarkeit Ihrer Anwendung sicherzustellen.
Häufige Fallstricke
Weiterführende Ressourcen
- Offizielle Docker-Dokumentation
- Kubernetes Offizielle Dokumentation
- Jenkins Pipeline-Dokumentation
- GitLab CI/CD YAML-Dokumentation
- Kubernetes Pod-Konzept
Worked Example: Automatisierte Bereitstellung einer Node.js-Anwendung via Docker und Kubernetes
SITUATION: Als Junior-DevOps-Ingenieur bei der „TechStart GmbH“ erhalten Sie die Aufgabe, die manuelle Bereitstellung der Webanwendung „ShopFront“ zu automatisieren. Bisher wurde der Code manuell auf den Server kopiert, was zu Inkonsistenzen zwischen Entwicklungs- und Produktivumgebung führte. Ziel ist es, ein reproduzierbares Docker-Image zu erstellen und dieses über ein Kubernetes-Deployment in der Testumgebung bereitzustellen.
DURCHFÜHRUNG: Wir gehen davon aus, dass der Node.js-Code bereits in einem Git-Repository liegt. Der folgende Walkthrough demonstriert die lokale Erstellung des Images und die anschließende Konfiguration in Kubernetes.
Zunächst erstellen wir das Dockerfile, das die Bauanleitung für das Image definiert. Wir nutzen ein schlankes Basis-Image, um die Sicherheitsfläche zu minimieren.
# Dockerfile
FROM node:18-alpine
# Arbeitsverzeichnis im Container setzen
WORKDIR /app
# Abhängigkeiten kopieren und installieren
COPY package*.json ./
RUN npm ci --only=production
# Quellcode kopieren
COPY . .
# Exponierten Port definieren
EXPOSE 3000
# Startbefehl für die Anwendung
CMD [ "node", "server.js" ]
Nachdem das Dockerfile erstellt ist, bauen wir das Image lokal. Der Befehl -t taggt das Image mit einem Namen und einer Version, was für die spätere Identifikation in der Registry entscheidend ist.
docker build -t shopfront:v1.0 .
Um sicherzustellen, dass das Image korrekt funktioniert, starten wir es lokal in einer isolierten Umgebung. Dies simuliert die spätere Ausführung im Cluster.
docker run -d --name shopfront-test -p 3000:3000 shopfront:v1.0
Im nächsten Schritt erstellen wir das Kubernetes-Manifest deployment.yaml. Dieses deklariert den gewünschten Zustand des Clusters. Wir definieren hier drei Repliken, um Verfügbarkeit zu gewährleisten, und verweisen auf das zuvor erstellte Image.
apiVersion: apps/v1
kind: Deployment
metadata:
name: shopfront-deployment
spec:
replicas: 3
selector:
matchLabels:
app: shopfront
template:
metadata:
labels:
app: shopfront
spec:
containers:
- name: shopfront
image: shopfront:v1.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Wir wenden dieses Manifest auf den Kubernetes-Cluster an. Der apply-Befehl sorgt dafür, dass der Cluster den aktuellen Zustand mit dem gewünschten Zustand abgleicht und ggf. Änderungen durchführt.
kubectl apply -f deployment.yaml
Schließlich erstellen wir einen Service, um den Traffic von außen auf die Pods zu leiten. Ohne diesen Schritt wäre die Anwendung im Cluster isoliert und nicht von außen erreichbar.
kubectl expose deployment shopfront-deployment --type=LoadBalancer --port=80 --target-port=3000
ERGEBNIS: Nach Ausführung der Schritte ist die Anwendung „ShopFront“ hochverfügbar im Cluster verteilt. Die Ausgabe von kubectl get pods zeigt drei laufende Pods im Status Running. Der LoadBalancer-Service hat eine externe IP-Adresse erhalten, über die die Anwendung im Browser erreichbar ist. Bei einem Ausfall eines Pods übernimmt Kubernetes automatisch die Neustartlogik, um die gewünschte Replika-Anzahl von drei wiederherzustellen.
REFLEXION: Sie haben verstanden, wie Containerisierung die Portabilität gewährleistet: Das gleiche Image, das lokal getestet wurde, läuft identisch im Cluster. Eine typische Falle war das Vergessen der resources-Limits im Deployment; ohne diese könnte ein einzelner Pod den gesamten Node im Cluster mit Speicher überlasten und andere Anwendungen abstürzen lassen. Durch die Definition von Requests und Limits wird die Stabilität des gesamten Clusters gesichert.
Wissens-Check
Vier Fragen zur Selbstkontrolle. Klicken Sie jede Frage an, um die richtige Antwort und Erklärung zu sehen.
Was ist der Hauptvorteil einer CI/CD-Pipeline in der Softwareentwicklung?
- A) Reduzierung der Anzahl der Entwickler im Team
- B) Automatisierung von Build-, Test- und Deploy-Prozessen
- C) Erhöhung der Komplexität des Codes
- D) Verringerung der Dokumentationspflicht
Richtige Antwort: B. CI/CD-Pipelines automatisieren Build-, Test- und Deploy-Prozesse, was die Entwicklung beschleunigt und stabilisiert. Option A ist falsch, da die Anzahl der Entwickler nicht reduziert wird. Option C ist falsch, da die Komplexität des Codes nicht erhöht wird. Option D ist falsch, da die Dokumentationspflicht nicht verringert wird.
Was ist ein Pod in Kubernetes?
- A) Ein Container-Orchestrierungssystem
- B) Die kleinste deploybare Einheit in Kubernetes
- C) Ein Speicherobjekt für persistente Daten
- D) Ein Netzwerk-Plugin für Kubernetes
Richtige Antwort: B. Ein Pod ist die kleinste deploybare Einheit in Kubernetes, die eine oder mehrere Container mit gemeinsamem Netzwerk und Speicher umfasst. Option A ist falsch, da Kubernetes das Container-Orchestrierungssystem ist. Option C ist falsch, da für persistente Daten andere Objekte wie PersistentVolume verwendet werden. Option D ist falsch, da Netzwerk-Plugins durch andere Komponenten bereitgestellt werden.
Welcher Befehl erstellt ein Docker-Image aus einem Dockerfile?
- A) docker create -t meine-app:latest
- B) docker run -t meine-app:latest
- C) docker build -t meine-app:latest
- D) docker deploy -t meine-app:latest
Richtige Antwort: C. Der Befehl 'docker build -t meine-app:latest' erstellt ein Docker-Image aus einem Dockerfile. Option A ist falsch, da 'docker create' einen Container erstellt, kein Image. Option B ist falsch, da 'docker run' einen Container startet, kein Image erstellt. Option D ist falsch, da 'docker deploy' kein gültiger Docker-Befehl ist.
Was ist die Hauptaufgabe von Kubernetes?
- A) Code-Versionierung und -Management
- B) Containerisierung von Anwendungen
- C) Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen
- D) Erstellung von Docker-Images
Richtige Antwort: C. Kubernetes ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen. Option A ist falsch, da Code-Versionierung und -Management durch Tools wie Git erfolgt. Option B ist falsch, da die Containerisierung durch Docker erfolgt. Option D ist falsch, da die Erstellung von Docker-Images durch Docker erfolgt.